import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;




public class JdbcArbeiter implements InterfaceArbeiter
{
	private Connection connection;
	
	private String url = "jdbc:mysql://localhost/zeiterfassung";
	private String user = "root";
	private String pwd = "";
	private String driver = "com.mysql.jdbc.Driver";
	
	private Connection getConnection() throws ZeitException
	{
		try
		{
			if (connection == null || connection.isClosed())
			{
				Class.forName(driver);
				//Verbindung anfordern
				connection = DriverManager.getConnection(url, user, pwd);
			}
		} catch (SQLException e)
		{
			throw new ZeitException("Fehler beim Verbinden der Datenbannk",e);
		} catch (ClassNotFoundException e)
		{
			throw new ZeitException("Treiber Fehlt bitte Laden!",e);
		}
		return connection;
	
	}

	private void update(Arbeiter a) throws Exception
	{
		String sql = "UPDATE mitarbeiter SET Nachname = ?,  Vorname = ?, Abteilung = ? WHERE Nachname = ?";
		try(PreparedStatement pstmt = getConnection().prepareStatement(sql))
		{
			pstmt.setString(1, a.getFamilienname());
			pstmt.setString(2, a.getVorname());
			pstmt.setString(3, a.getAbteilung());
			pstmt.executeUpdate();
		}
		catch(SQLException e)
		{
			throw new ZeitException("Fehler beim Update der ID",e);	
		}
		
	}
	
	private void insert(Arbeiter a) throws ZeitException
	{
		String sql = "Insert INTO mitarbeiter (Nachname, Vorname, Abteilung) VALUES (?, ?, ?)";
		try(PreparedStatement pstmt = getConnection().prepareStatement(sql, Statement.RETURN_GENERATED_KEYS))
		{
			
			pstmt.setString(1, a.getFamilienname());
			pstmt.setString(2, a.getVorname());
			pstmt.setString(3, a.getAbteilung());
			
			pstmt.executeUpdate();
			ResultSet generated = pstmt.getGeneratedKeys();
			if (generated.next())
				{a.setId(generated.getInt(1));
				System.out.print(""+generated.getInt(1));}
			else
				throw new ZeitException("Fehler beim Auslesen des Auto-Werts");
			generated.close();
		}
		catch (SQLException e)
		{
			throw new ZeitException("Fehler beim Speichern",e);
		}
		
		
	}
	

	@Override
	public void loeschen(Arbeiter a) throws Exception
	{
		// TODO Auto-generated method stub
					String sql = "DELETE FROM mitarbeiter WHERE id =?"; 
					
					try(PreparedStatement pstmt = getConnection().prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) 
					{	
						pstmt.setInt(1, a.getId());
						pstmt.executeUpdate();
						
					} 
					catch (SQLException e) 
					{
						throw new ZeitException(e.getMessage(), e);
					}
	}

	@Override
	public List<Arbeiter> suchen(String suchText) throws Exception
	{
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Arbeiter> alleArbeiter()throws Exception
	{
		System.out.print("doit");
		List<Arbeiter> alist = new ArrayList<>();
		String sql = "SELECT id, Nachname, Vorname, Abteilung FROM mitarbeiter";
		
		try(PreparedStatement pstmt = getConnection().prepareStatement(sql);
				ResultSet rs = pstmt.executeQuery())
		{
			while (rs.next())
			{
				System.out.print("schleife");
				Arbeiter a = new Arbeiter();
				int id = rs.getInt("id");
				a.setId(id);
				a.setFamilienname(rs.getString("Nachname"));
				a.setVorname(rs.getString("Vorname"));
				a.setAbteilung(rs.getString("Abteilung"));
				alist.add(a);
			}
		}
		catch(SQLException e)
		{
			throw new ZeitException("Fehler beim Laden der Produkte",e);
		}
		
		return alist;
	}
	

	@Override
	public void speichern(Arbeiter a) throws Exception
	{
		if (a.getId() == 0)
			insert(a);
		else 
			update(a);
	}

	@Override
	public void bearbeiten(Arbeiter a) throws Exception
	{
		String sql = "UPDATE mitarbeiter SET " +
				"Nachname = ?, " +
				"Vorname = ?, Abteilung = ? " +
				"WHERE id = ?"; 
		
		try(PreparedStatement pstmt = getConnection().prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) 
		{	
			pstmt.setString(1, a.getFamilienname());
			pstmt.setString(2, a.getVorname());
			pstmt.setString(3, a.getAbteilung());
			pstmt.setInt(4, a.getId());
			pstmt.executeUpdate();
			System.out.print(""+a.getId());
			
		} 
		catch (SQLException e) 
		{
			throw new ZeitException(e.getMessage(), e);
		}
		
	}

}
